google rpc | firebase rpc wrapper | test google express rpc handler | Search

This Firebase Cloud Function, using Express.js middleware, provides a remote procedure call (RPC) endpoint that accepts function names from requests, executes them, and returns the results as JSON responses. It also logs the results and handles cookies and CORS.

Run example

npm run import -- "google cloud function rpc wrapper"

google cloud function rpc wrapper

var cookie = require('cookie');
var cors = require('cors')({origin: true});
var importer = require('../Core');
var getResult = importer.import("rpc result");
var getEnvironment = importer.import("get environment");

var expressToResult = (req, res) => getResult({
    command: (req.body || {})['function'] || (req.query || {})['function'],
    result: importer.interpret((req.body || {})['function'] || (req.query || {})['function']),
    body: req.method === 'POST' ? req.body : req.query,
    circles: ['Public']
})

var logResult = (r) => {
    // TODO: call storeResult()?
    var result = typeof r === 'object'
        ? Object.keys(r).reduce((alt, key) => {
            alt[key] = r[key] + '';
            return alt;
        }, {})
        : ('' + r);
    console.log(result);
    return result;
}

function expressHandler(req, res) {
    getEnvironment();
    req.cookies = cookie.parse(req.get('cookie') || '');
    res.setHeader('Cache-Control', 'private');
    cors(req, res, () => {});
    return Promise.resolve()
        .then(() => expressToResult(req, res))
        .then(r => (res.status(200), r))
        .catch(e => (res.status(500), e))
        .then(r => logResult(r))
        .then(r => res.send(r));
}

module.exports.handler = expressHandler;

What the code could have been:

const cookie = require('cookie');
const cors = require('cors')({ origin: true });
const { importModule } = require('../Core');
const { getResult, interpret } = importModule(['rpc result', 'get environment']);

const expressToResult = (req, res) => {
  const func = req.body?.function || req.query?.function;
  const data = req.method === 'POST'? req.body : req.query;
  const result = getResult({
    command: func,
    result: interpret(func),
    body: data,
    circles: ['Public'],
  });

  return result;
};

const logResult = (r) => {
  let result;
  if (typeof r === 'object') {
    result = Object.fromEntries(Object.entries(r).map(([key, value]) => [key, value.toString()]));
  } else {
    result = r.toString();
  }

  console.log(result);
  return result;
};

const expressHandler = (req, res) => {
  getEnvironment();

  req.cookies = cookie.parse(req.get('cookie') || '');
  res.setHeader('Cache-Control', 'private');
  cors(req, res, () => {});

  return Promise.resolve()
   .then(() => expressToResult(req, res))
   .then((r) => {
      res.status(200);
      return r;
    })
   .catch((e) => {
      res.status(500);
      return e;
    })
   .then(logResult)
   .then((r) => res.send(r));
};

module.exports.handler = expressHandler;

This code sets up an Express.js middleware function for a Firebase Cloud Function that acts as a remote procedure call (RPC) endpoint.

Here's a breakdown:

  1. Dependencies:

  2. expressToResult Function:

  3. logResult Function:

  4. expressHandler Function:

  5. Export: